package algo_annotations.params;

// Parametres pour l'algorithme des annotations

import algo_annotations.data.MyFont;
import algo_annotations.heuristique.Evolution;
import algo_annotations.params.objects.ContrainteGeomSegment;
import algo_annotations.params.objects.ContrainteGeomAnno;
import commons.data.EchelleGeneralization;
import commons.data.category.Category;
import commons.io.in.File_in;
import commons.params.A_Params;
import commons.params.objects.ObjectColor;
import commons.data.Zone;
import java.util.ArrayList;


public class Params_a extends A_Params {

	// Nom du fichier de paramètre utilisé -> utilisé pour proposer un nom de traitement pour la sauvegarde
	//  et pour le titre de la fenêtre principale
	public String nomParam;
	@Override
	public String getParamName() {
		return nomParam;
	}
	
	public Params_a() {}

	public String nomCoucheSite;
	public File_in coucheSite;
	public String nomChampLibelle;

	public boolean bSupprDoublon;
	public double factorDistMaxSupprDoublons;

	public ArrayList<Category> vCategorySite;
	public Category mainFilterSite;

	// Pour les anno, la couleur est un parametre important, qui joue sur la notion de lisibilité et d'ambiguite
	public boolean bUseDifferentiationCouleur;
	public ArrayList<ObjectColor> vObjectColor;


	public String fontName;
	public MyFont myFont;
	public ArrayList<ContrainteGeomAnno> vContrainteGeomAnno;
	public boolean bUseMultiligne;
	public double facteurProtection_superpositionLigneSite;
	public double facteurProtection_superpositionAnno_1L;
	// protection spéciale, potentiellement plus importante que 1L, car en multiligne c'est plus dur de séparer les anno visuellement
	public double facteurProtection_superpositionAnno_2L;
	public double facteurEspaceInterligne;

	public double facteurLimiteAmbiguite;

	
	public String nomCoucheSegement;
	public File_in coucheSegment;
	public double toleranceSegment_papier_mm;
	public ArrayList<Category> vCategorySegment;
	public Category mainFilterSegment;
	public ArrayList<ContrainteGeomSegment> vContrainteGeomSegment;


	public ArrayList<Zone> vZone;


	public ArrayList<EchelleGeneralization> vEchelleGeneralizationSite;
	public ArrayList<EchelleGeneralization> vEchelleGeneralizationSegment;


	public double echelleCible_inv;


	public EchelleGeneralization getDefautEchelleGeneralizationSite() {return vEchelleGeneralizationSite.get(0);}
	public EchelleGeneralization getDefautEchelleGeneralizationSegment() {return vEchelleGeneralizationSegment.get(0);}


	// ****** Paramètre de l'algo *********************
	// Paramètres algo 1ère passe
	public int algo_tailleVivier_pass1;
	public int algo_nbIter_pass1;


	// poids des différentes notes
	public double poids_noteDistSonSite;
	public double poids_noteAlignementHorizontal;
	public double poids_resterSur1Ligne;

	public double poids_noteSuperpositionAutreAnno;
	public double poids_noteSuperpositionSite;
	public double poids_noteSuperpositionSegment;

	public double poids_noteAmbiguiteLecture_MemeCouleur;
	public double poids_noteAmbiguiteLecture_AutreCouleur;
	public double poids_noteCroisementLienAnnoSite;





	//**************************************************************************

	// Paramètres algo 2ème passe
	public boolean bMake2Pass;
	public double algo_seuilNote_pass2;
	public double algo_seuilInteraction_pass2;
	public int algo_tailleVivier_pass2;
	public int algo_nbIter_pass2;
	public boolean bModeInteractif_pass2;

		
	public double poids_TOTAL;


	// Pour toutes ces méthodes de récup d'objets par leur nom,
	// vu les controles effectués par ParamsManager, on est obligé de trouver ...
	@Override
	public Category getCategoryByName(String name, TYPE_OBJECT typeObject) {
		switch(typeObject) {
			case SITE_A: return getCategorySiteByName(name);
			case SEGMENT_A: return getCategorySegmentByName(name);
			default: assert false; return null;
		}
	}
	public Category getCategorySiteByName(String name) {
		for (Category cat : vCategorySite) if (cat.name.equals(name)) return cat;
		assert(false); return null;
	}
	public Category getCategorySegmentByName(String name) {
		for (Category cat : vCategorySegment) if (cat.name.equals(name)) return cat;
		assert(false); return null;
	}
	public Zone getZoneByName(String name) {
		for (Zone zone : vZone) if (zone.name.equals(name)) return zone;
		assert(false); return null;
	}
}
